package cn.alpaca.cloud.common.bean;

import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory;

import java.util.List;

public class BeanUtil {

    private static final MapperFacade mapperFacade;

    static {
        MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        // 可以在这里配置自定义的映射规则
        // mapperFactory.classMap(SourceClass.class, DestinationClass.class).byDefault().register();
        mapperFacade = mapperFactory.getMapperFacade();
    }

    private BeanUtil() {
        // 私有构造函数，防止实例化
    }

    /**
     * 将源对象映射为目标对象。
     *
     * @param source 源对象
     * @param destinationClass 目标对象的类类型
     * @param <S> 源对象的泛型类型
     * @param <D> 目标对象的泛型类型
     * @return 映射后的目标对象
     */
    public static <S, D> D map(S source, Class<D> destinationClass) {
        return mapperFacade.map(source, destinationClass);
    }

    /**
     * 将源对象映射到已存在的目标对象。
     *
     * @param source 源对象
     * @param destination 目标对象
     * @param <S> 源对象的泛型类型
     * @param <D> 目标对象的泛型类型
     */
    public static <S, D> void map(S source, D destination) {
        mapperFacade.map(source, destination);
    }

    /**
     * 将源对象列表映射为目标对象列表。
     *
     * @param sourceList 源对象列表
     * @param destinationClass 目标对象的类类型
     * @param <S> 源对象的泛型类型
     * @param <D> 目标对象的泛型类型
     * @return 映射后的目标对象列表
     */
    public static <S, D> List<D> mapAsList(List<S> sourceList, Class<D> destinationClass) {
        return mapperFacade.mapAsList(sourceList, destinationClass);
    }
}
